#ifndef HR_HPP
#define HR_HPP

#include "ap_int.h"
#include "ap_fixed.h"
#include "hls_stream.h"
#include "fpal.hpp" // 包含定点数运算逻辑库

// -----------------------------------------------------------
// 输入结构体：从PS/DDR接收的定点数三角形光栅化参数
// PS侧负责将浮点数转换为这些定点数格式
// -----------------------------------------------------------
struct raster_params_packet_fixed {
    // 屏幕空间定点数顶点坐标 (2D)
    fpal::fp_coord_t v0_x, v0_y;
    fpal::fp_coord_t v1_x, v1_y;
    fpal::fp_coord_t v2_x, v2_y;

    // 屏幕空间原始深度值 (1/Z)，用于深度插值
    // 已知PS已经将1/Z映射到 fpal::fp_z_buffer_t 的 U.16.0 范围
    fpal::fp_z_buffer_t v0_z, v1_z, v2_z; 

    // 三角形边缘方程系数 (A, B, C)
    // Ax + By + C = 0，其中 A, B, C 均为 fpal::fp_coord_t
    // C0 对应 v0v1 边，C1 对应 v1v2 边，C2 对应 v2v0 边
    fpal::fp_coord_t edge0_A, edge0_B, edge0_C;
    fpal::fp_coord_t edge1_A, edge1_B, edge1_C;
    fpal::fp_coord_t edge2_A, edge2_B, edge2_C;

    // 深度梯度 (dzdx, dzdy)
    // dzdx 和 dzdy 均为 fpal::fp_coord_t
    // 这里采用基准点v0的深度作为插值基准
    fpal::fp_coord_t dzdx;
    fpal::fp_coord_t dzdy;

    // 纯色 (RGB)
    fpal::fp_color_channel_t pure_color_R;
    fpal::fp_color_channel_t pure_color_G;
    fpal::fp_color_channel_t pure_color_B;
};

// -----------------------------------------------------------
// 新增结构体1: HR_Setup 生成的三角形参数包
// -----------------------------------------------------------
struct triangle_setup_packet_fixed {
    fpal::fp_coord_t v0_x, v0_y; // 基准点V0的坐标
    fpal::fp_z_buffer_t v0_z;    // 基准点V0的深度

    fpal::fp_coord_t edge0_A, edge0_B, edge0_C;
    fpal::fp_coord_t edge1_A, edge1_B, edge1_C;
    fpal::fp_coord_t edge2_A, edge2_B, edge2_C;

    fpal::fp_coord_t dzdx;
    fpal::fp_coord_t dzdy;

    fpal::fp_color_channel_t pure_color_R;
    fpal::fp_color_channel_t pure_color_G;
    fpal::fp_color_channel_t pure_color_B;

    fpal::fp_screen_pixel_idx_t min_x, max_x, min_y, max_y; // Bounding Box
    ap_uint<11> max_x_res; // 屏幕分辨率，用于边界检查
};

// -----------------------------------------------------------
// HR_Row_Processor 生成的行描述包
// -----------------------------------------------------------
struct row_description_packet_fixed {
    fpal::fp_screen_pixel_idx_t y;          // 当前行Y坐标
    fpal::fp_screen_pixel_idx_t min_x, max_x; // 当前行的X范围

    fpal::fp_coord_t initial_z_for_row_fx; // (min_x, y) 处的插值深度值 (fp_coord_t 格式)
    fpal::fp_coord_t dzdx;                 // 深度X梯度

    fpal::fp_color_channel_t pure_color_R;
    fpal::fp_color_channel_t pure_color_G;
    fpal::fp_color_channel_t pure_color_B;

    fpal::fp_coord_t edge0_A, edge0_B, edge0_C; // 边缘方程系数
    fpal::fp_coord_t edge1_A, edge1_B, edge1_C;
    fpal::fp_coord_t edge2_A, edge2_B, edge2_C;
};


// -----------------------------------------------------------
// 输出结构体：HR_Pixel_Generator 生成的定点数像素片段 (原 HR 输出)
// -----------------------------------------------------------
struct pixel_fragment_packet_fixed {
    fpal::fp_screen_pixel_idx_t screen_x;       // 屏幕X坐标
    fpal::fp_screen_pixel_idx_t screen_y;       // 屏幕Y坐标
    fpal::fp_z_buffer_t interpolated_z;         // 插值后的深度值
    fpal::fp_color_channel_t pure_color_R; // 纯色R
    fpal::fp_color_channel_t pure_color_G; // 纯色G
    fpal::fp_color_channel_t pure_color_B; // 纯色B
    bool is_valid_pixel;                        // 是否为有效像素
};


// -----------------------------------------------------------
// HR 子模块声明
// -----------------------------------------------------------
void hr_setup(
    hls::stream<raster_params_packet_fixed>& input_raster_params_stream,
    hls::stream<triangle_setup_packet_fixed>& output_triangle_setup_stream,
    const ap_uint<11> max_x_res, 
    const ap_uint<11> max_y_res,  
    const ap_uint<16> num_triangles_to_process
);

void hr_row_processor(
    hls::stream<triangle_setup_packet_fixed>& input_triangle_setup_stream,
    hls::stream<row_description_packet_fixed>& output_row_description_stream,
    const ap_uint<16> num_triangles_to_process,
    hls::stream<ap_uint<32>>& output_estimated_fragments_count // Modified to stream output
);

void hr_pixel_generator(
    hls::stream<row_description_packet_fixed>& input_row_description_stream,
    hls::stream<pixel_fragment_packet_fixed>& output_pixel_fragment_stream,
    hls::stream<ap_uint<32>>& input_fragments_count_hr_row_proc, // 从 hr_row_processor 接收总片段的估计值
    hls::stream<ap_uint<32>>& output_actual_fragments_count_stream // <-- MODIFIED: hr_pixel_generator 写入实际片段计数
);


// -----------------------------------------------------------
// HR 模块的顶层 HLS 函数声明
// -----------------------------------------------------------
void hardware_rasterizer(
    hls::stream<raster_params_packet_fixed>& input_raster_params_stream,
    hls::stream<pixel_fragment_packet_fixed>& output_pixel_fragment_stream,
    const ap_uint<11> max_x_res, 
    const ap_uint<11> max_y_res,  
    const ap_uint<16> num_triangles_to_process,
    ap_uint<32>& total_fragments_generated,     // HR 模块的顶层输出参数
    hls::stream<ap_uint<32>>& hr_to_pdtd_fragment_count_stream // HR 到 PDTD 的片段计数流
);

#endif // HR_HPP

